// 定义基本类型
let num: number = 100
let str: string = 'str'
let flag: boolean = true

// null 和 undefined 是所有类型的子类
let nulls: null = null
let und: undefined = undefined

// 类型别名
type nsb = number | string

// 联合类型
let num2: nsb = 888



// 接口  interface (匹配对象)
// 接口 I  
// readonly  只读
interface IUserInfo {
    readonly userName: number,
    passWord: string,
    // ?  可有可无
    remember?: boolean
}

// interface IUserInfo2 {
//     passWord1: string,
//     // ?  可有可无
//     remember2?: boolean
// }

// type nsb2 = IUserInfo & IUserInfo2


let obj: IUserInfo = {
    userName: 1000,
    passWord: "aaa"
}


// 枚举(两种写法)
// 1. 获取的时候 Day[角标](字符串)     Day.属性(角标)
// enum Day {
//     Monday,
//     Tuesday
// }

// 2.
// enum Day {
//     m = "Monday",
//     t = "Tuesday"
// }

// console.log(Day.m)


// 数组 
// 1. 
// let arr: [number] = [1]
// let arr: number [] = [1, 2, 3, 4, 5]
// // 2. 通过泛型的方式
// let arr2: Array<number> = [1, 2, 3, 4 ,5 , 6]


// 元组  tuple   (数组中可以定义不同类型)
// let arr: [number, string] = [1, 'sd']


// 任意 any
let a: any = "1"

// 函数  () 定义返回值的内容
// 没有返回值  void
// function add(a: number, b: number): number {
//     return a + b
// }

// const nums = add(1, 2)



// 泛型    <T> 没有实际意义
// function add<T>(a: T, b: T) {
//     // return a + b
// }

// const num5 = add(11, 22)

// const num6 = add('11', '22')

interface IPush {
    push: any
}

// 约束性泛型   咱们必程序先知
// 通过继承
function add<T extends IPush>(list: T) {
    return list.push(4)
}

console.log(add([1, 2, 3]))



// 枚举    *泛型   约束性泛型



